BGP Flowspec
BGPのNLRIにトラフィックコントロールするためのメッセージを載せて、遠隔からフィルター、帯域制御を行わせるための仕組み。ACLと違い複数のルータへ特定refixのフィルターや帯域制御を一挙に行えるのでエッジルーターでのDDOS用フィルター の発動や帯域制限などにしばしば使われる。
NLRIとBGP communityに様々なFlow情報とアクションを定義することで受信したルーターに遠隔から対象に対しての任意のアクションを実行させる。実装としてはBGPのFlow情報はMP_REACH_NLRI,MP_UNREACH_NLRIで伝搬して、ActionであるRuleはBGP Communityで伝達する。 条件を詰めるNLRIは具体的には次のようなフォーマットである。
長さは240未満でないといけない。
code:NLRI
+------------------------------+
| length (0xnn or 0xfn nn) |
+------------------------------+
| NLRI value (variable) |
+------------------------------+
Flowspec-Condition
NLRI valueに実際の条件を組み込める。条件は次のtypeの種類で設定できる。
これらのTypeひとつひとつをflow componentと呼ぶ。
type1 Destination Prefix
type2 Source Prefix
type3 IP Protocol :IP packetのip protocol valueのこと。tcp/udpとかの条件
type4 Port (sourc,dest両方の portが条件)
type5 Destination port (destのportが条件)
type6 Source port
type7 ICMP type
type8 ICMP code
type9 TCP flags
type10 Pcket length
type11 DSCP
type12 Fragment
type3-12のフォーマットは<type(1octec), {operator.value}+>という形式であることがおおい。ここでoperatorは次のようなフォーマットである。これで各typeでの細かい論理演算子を設定できる。
code: type3 operator byte value
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| e | a | len | 0 |lt |gt |eq |
+---+---+---+---+---+---+---+---+
具体例としてdest 10.0.1/24 且つ port25という条件だと次のようになる。
最初の1octetが条件であり、そのあとは対象を示す。
code: Condition
typeのあとにそのtypeで使う条件のパラメータが続く。もちろんフォーマットはtypeごとに違うので詳しくはRFC参照。
+------------------+----------+----------+
| destination | proto | port |
+------------------+----------+----------+
| 0x01 18 0a 00 01 | 03 81 06 | 04 81 19 |
+------------------+----------+----------+
Portの項目についてについてDecodeすると次のようになる
0x81 = 1 0 01 0 0 0 1
+-------+----------+------------------------------+
| Value | | |
+-------+----------+------------------------------+
| 0x04 | type | port |
| 0x81 | operator | end-of-list, value size=1, = |
| 0x19 | value | 25 |
+-------+----------+------------------------------+
FlowSpec-Action
raite filterやactionを実行するのにBGP (extende) community に値をいれる。
次のtypeがcommunityのtype codeとして予約されている。面白いのがRT指定してのVRF redirect。
BGP Flow-Specでservice chaingを実装するのにこの機能を使っていたりする。
code: rule
+--------+--------------------+--------------------------+
| type | extended community | encoding |
+--------+--------------------+--------------------------+
| 0x8006 | traffic-rate | 2-byte as#, 4-byte float |
| 0x8007 | traffic-action | bitmask |
| 0x8008 | redirect | 6-byte Route Target |
| 0x8009 | traffic-marking | DSCP value |
+--------+--------------------+--------------------------+
Validateion
BGP FlowSpecのUpdateを受信した際にはルーターはそのUpdateをLOC-RIBにインストールする前にvalidationをすべき
しかしルータの機種によってはこのValidationをomitすることもできてしまう。AS内だけで使うならomitもあり。
Validationする際には次の2項目をチェックする。この記事で詳しく記載されている。 Flowspec 経路と,そのdestination prefix を含む最小の経路は,同じBGP セッションから受信する必要がある
要はflowspec経路の宛先prefixを広報したルータとflowspceを広報してくるルータは同じでないといけない。
BGP テーブル上に,destination prefix よりmore specific な経路がない
総合するとvalidationを無効化しないとflowspec注入ルーターみたいなものを構成するのはめんどくさくなる。
/32単位での単一ホスト指定のflowspecも対応ができなくなる。
/32で広報してればできるが、まぁ一部の世界でしかない話。
ただiosxrだとiBGPでの注入されたflowspecに限りvalidationは無視されるとか
flowspecにBGP communityは付与できる。
経路フィルターで特定のルータだけでflowspec発動などの実装も可能